#include "includes.h"

extern void BSP_IntVectSet(CPU_DATA int_id, CPU_FNCT_VOID isr);

#define LED_ON(a,b)		GPIO_SetBits(a, b)
#define LED_OFF(a,b)		GPIO_SetBits(a, b)

OS_EVENT *key_mem;
u32           key_msg=0;
//u32           flag;


//test if key has pressed, 1 pressed, 0 not pressed
u8 TestKey(u16 key)
{
	if(!GPIO_ReadInputDataBit(GPIOE, key))
	{
		return 1;
	}
	else
	{	return 0;
	}
}

void LedOn(u8 number, u16 led)
{
	if(number<3)
	{
		GPIO_SetBits(GPIOC, led);
	}
	else
	{
		GPIO_SetBits(GPIOD, led);
	}
}

void LedOff(u8 number, u16 led)
{
	if(number<3)
	{
		GPIO_ResetBits(GPIOC, led);
	}
	else
	{
		GPIO_ResetBits(GPIOD, led);
	}
}
void GPIO_Key_ISR_Configure(void)
{
	NVIC_InitTypeDef nvic_init;
	EXTI_InitTypeDef exti_init;
	GPIO_InitTypeDef initDef;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //enable AFIO

	
	nvic_init.NVIC_IRQChannel = EXTI9_5_IRQn;
	nvic_init.NVIC_IRQChannelPreemptionPriority = 5;
	nvic_init.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&nvic_init);

	
	
	initDef.GPIO_Mode = GPIO_Mode_IPU;
	initDef.GPIO_Speed = GPIO_Speed_50MHz;
	initDef.GPIO_Pin = KEY1 | KEY2 |KEY3 | KEY4;
	GPIO_Init(GPIOE, &initDef);
	

	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5);

	EXTI_DeInit();
	EXTI_ClearFlag(EXTI_Line2 | EXTI_Line3 | EXTI_Line4 | EXTI_Line5);
	EXTI_ClearITPendingBit(EXTI_Line2 | EXTI_Line3 | EXTI_Line4 | EXTI_Line5);

	
	exti_init.EXTI_Line = EXTI_Line5;
	exti_init.EXTI_Mode = EXTI_Mode_Interrupt;
	exti_init.EXTI_Trigger = EXTI_Trigger_Falling;
	exti_init.EXTI_LineCmd = ENABLE;
	EXTI_Init(&exti_init);
	
}
void GPIO_Key_Configure(void)
{
	GPIO_InitTypeDef initDef;
	initDef.GPIO_Mode = GPIO_Mode_IPU;
	initDef.GPIO_Speed = GPIO_Speed_50MHz;
	initDef.GPIO_Pin = KEY1 | KEY2 | KEY3 | KEY4;

	GPIO_Init(GPIOE, &initDef);

}

void GPIO_Led_Configure(void)
{
	GPIO_InitTypeDef initDef;
	initDef.GPIO_Mode = GPIO_Mode_Out_PP;
	initDef.GPIO_Speed = GPIO_Speed_10MHz;
	initDef.GPIO_Pin = LED1 | LED2;

	GPIO_Init(GPIOC, &initDef);

	initDef.GPIO_Pin = LED3 | LED4;

	GPIO_Init(GPIOD, &initDef);
}


void App_TaskScanKey(void * p_arg)
{
	static u8 a=1,b=1,c=1,d=1;
	GPIO_Key_Configure();
	GPIO_Led_Configure();


	while(TRUE)
	{
		if(TestKey(KEY1))
		{
			if(a)
			{
				a=0;
				LedOn(1, LED1);
			}
			else
			{
				a=1;
				LedOff(1, LED1);
			}
			while(TestKey(KEY1));
		}
		if(TestKey(KEY2))
		{
			if(b)
			{
				b=0;
				LedOn(2, LED2);
			}
			else
			{
				b=1;
				LedOff(2, LED2);
			}
			while(TestKey(KEY2));
		}

		if(TestKey(KEY3))
		{
			if(c)
			{
				c=0;
				LedOn(3, LED3);
			}
			else
			{
				c=1;
				LedOff(3, LED3);
			}
			while(TestKey(KEY3));
		}

		if(TestKey(KEY4))
		{
			if(d)
			{
				d=0;
				LedOn(4, LED4);
			}
			else
			{
				d=1;
				LedOff(4, LED4);
			}
			while(TestKey(KEY4));
		}
		

		OSTimeDlyHMSM(0, 0, 0, 100);
	
	}

}

void ISR_key(void)
{
	static u32 flag = 1;

	if(EXTI_GetITStatus(EXTI_Line5)!=RESET)
	{
		flag = 12;
	 	OSMboxPostOpt(key_mem, &flag, OS_POST_OPT_BROADCAST);
//		if(flag)
//		LedOn(1, LED1);
//		else
//		LedOff(1, LED1);
//
//		flag = !flag;
        //LedOn(1, LED1);
	 EXTI_ClearITPendingBit(EXTI_Line5);
	 EXTI_ClearFlag(EXTI_Line5);
	}

}

void App_TaskISRKey(void *p_arg)
{
	INT8U perr;
	BSP_IntVectSet(BSP_INT_ID_EXTI9_5, (CPU_FNCT_VOID)ISR_key);
	GPIO_Led_Configure();
	GPIO_Key_ISR_Configure();

	key_mem = OSMboxCreate((void*)0);

	while(1)
	{
		key_msg = *(u32 *)OSMboxPend(key_mem, 0, &perr);
		if(key_msg==12)
		{
			LedOn(1, LED1);
		}

	}
		
	
}


